package br.unisal.repository;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import br.unisal.domain.Entregador;
import br.unisal.domain.Pedido;
import br.unisal.reader.LeitorXML;

public class PedidoRepository {

	private List<Pedido> pedidos = new ArrayList<Pedido>();
	private static Integer sequencialDosPedidos = 1;

	public PedidoRepository() {
//		ProdutoRepository item = new ProdutoRepository();
//		ItemSolicitado is = new ItemSolicitado(item.getProdutoPeloCodigo(1), 1);
//		List<ItemSolicitado> itens = new ArrayList<>();
//		itens.add(is);
//		Cliente cliente1 = new Cliente("1112", "Red", "Silva", new Endereco(
//				"aaa", 11, "aa", "aa", "aa"));
//		Cliente cliente2 = new Cliente("1113", "Red", "Silva", new Endereco(
//				"aaa", 11, "aa", "aa", "aa"));
//		Pedido pedido1 = new Pedido(cliente1, itens, FormaDePagamento.DINHEIRO);
//		pedido1.setAtivo(false);
//		Pedido pedido2 = new Pedido(cliente2, itens, FormaDePagamento.DINHEIRO);
//
//		adicionaNovoPedido(pedido1);
//		adicionaNovoPedido(pedido2);

		pedidos = new LeitorXML().lePedidos();
		sequencialDosPedidos += pedidos.size();
		this.ordenaPedidos();
	}
	
	private void ordenaPedidos(){
	    Collections.sort (this.pedidos, new Comparator<Pedido>() {  
		@Override
		public int compare(Pedido p1, Pedido p2) {

			return p1.getCodigo() < p2.getCodigo() ? -1 : (p1.getCodigo() > p2.getCodigo() ? +1 : 0);
		}  
	    });  
	}

	public static Integer getSequencialDosPedidos() {
		return sequencialDosPedidos;
	}

	public static void setIncrementaSequencialDosPedidos() {
		++PedidoRepository.sequencialDosPedidos;
	}

	public Pedido consultarPedido(Pedido pedido) {
		if (this.pedidos.size() > 0) {
			for (Pedido pedidoRepository : this.pedidos) {

				if (pedidoRepository == pedido) {
					return pedido;
				}
			}
		}
		return null;
	}

	public void adicionaNovoPedido(Pedido pedido) {
		this.pedidos.add(pedido);
	}

	public void desativaPedidoQuandoEntregadorRetorna(Integer codigo) {
		Pedido pedido = encontraPedidoParaAlterar(codigo);
		pedido.setAtivo(false);
		pedido.setVoltaEntrega(new Date());
	}

	public void alteraPedidoEntregador(Integer codigo, Entregador entregador) {
		Pedido pedido = encontraPedidoParaAlterar(codigo);
		pedido.setEntregador(entregador);
		pedido.setSaidaEntrega(new Date());
	}

	private Pedido encontraPedidoParaAlterar(Integer codigo) {
		for (Pedido pedido : this.pedidos) {
			if (pedido.getCodigo().equals(codigo)) return pedido;
		}
		return null;
	}

	public void removePedidoPorCodigo(Integer codigo) {
		Pedido pedido = encontraPedidoParaAlterar(codigo);
		this.pedidos.remove(pedido);
	}

	public List<Pedido> getPedidos() {
		this.ordenaPedidos();
		return this.pedidos;
	}

	public Pedido[] retornaPedidosParaEnviarEmArray() {
		this.ordenaPedidos();
		List<Pedido> pedidosAtivos = new ArrayList<>();

		for (Pedido pedido : this.pedidos) {
			if (pedido.isAtivo() && pedido.getEntregador() == null)
				pedidosAtivos.add(pedido);
		}

		Pedido[] array = pedidosAtivos.toArray(new Pedido[pedidosAtivos.size()]);
		return array;
	}
	
	public Pedido[] retornaPedidosParaFecharEmArray() {
		this.ordenaPedidos();
		List<Pedido> pedidosAtivos = new ArrayList<>();

		for (Pedido pedido : this.pedidos) {
			if (pedido.isAtivo() && pedido.getEntregador() != null)
				pedidosAtivos.add(pedido);
		}

		Pedido[] array = pedidosAtivos.toArray(new Pedido[pedidosAtivos.size()]);
		return array;
	}	
	
}
